#include <stdio.h>
#include <stdlib.h>

// 形参 x、 y, 通过指针变量来接收
void func(int x, int y)
{
    /* 当变量a、b作为实参传入时，是将a的值赋值给x，b的值赋值给y
    int x = a;
    int y = b;
    */

    // 当形参x、y在函数内部重新赋值时，形参值发生改变。实参的值不发生变化
    x = 100;
    y = 200;
    printf("func: x = %d, y = %d\n", x, y);
}

// 形参 x、 y, 只能通过指针变量来接收地址
void swapA(int *x, int *y)
{
    /* 当变量a、b以地址传入时，是将a的地址赋值给指针变量 x， b的地址赋值给指针变量y
    int *x = &a;  // x 指向是变量的地址， *x 是指针变量的值
    int *y = &b;
    */

    printf("methodB: x=%p, y=%p\n", x, y);
    // int *temp = x;
    // x = y;
    // y = temp;

    // 将指针变量 x 的变量值 赋值给 temp 变量
    int temp = *x;
    *x = *y;
    *y = temp;
    printf("methodA: x=%p, y=%p\n", x, y);
}

// 形参 x、 y, 只能通过指针变量来接收地址
void swap(int *x, int *y)
{
    /* 当变量a、b以地址传入时，是将a的地址赋值给指针变量 x， b的地址赋值给指针变量y
    // 此时 x(y) 与 a(b) 是指向的是同一个地址
    int *x = &a;
    int *y = &b;
    */

    // 将指针变量 x 的变量值赋值给 temp 变量. 当x、y的值发生变化时，
    // a、b指针变量指向的变量值也发生变量
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main(void)
{
    int a = 10;
    int b = 20;
    // 变量a、b为func函数的实际参数，传递地址
    printf("before: a = %d, b = %d\n", a, b);
    printf("address: ap = %p, bp = %p\n", &a, &b);
    swapA(&a, &b);
    printf("after : a = %d, b = %d\n", a, b);

    for (int i = 0; i < 5; i++)
    {
        int num;
        scanf("%d", &num);
        printf("输入的数字是：%d\n", num);
    }
    return 0;
}
/*
输出：
before: a = 10, b = 20
after : a = 20, b = 10
*/